查看原文
其他

软件应用 | 教你用Stata做描述性统计表

数据Seminar 2022-12-31

The following article is from Stata and Python数据分析 Author 爬虫俱乐部

本文转载自公众号Stata and Python数据分析

导读

描述性统计表格是大家在日常工作和学习中必不可少的一类工具,一般来讲,当我们拿到一份经过清洗的数据,就会对新数据进行描述性统计分析,从而进行更深入的研究。描述性统计表格提供了对于数据最初的认知,如数据的集中趋势、分散程度以及频数分布等,常用的指标为频数,平均值,中位数,方差、标准差等。我们有时需要在论文中用表格的形式呈现出全样本、实验组、控制组的数据特征。这时,我们可以使用stata进行操作,下面小编就以Stata自带的auto数据集为例,用tabstat命令和putdocx命令为大家展示一下如何输出描述性统计表格吧!

导入数据

在auto数据集中,变量foreign里已经根据汽车是否是国产对数据进行了分组。其中,国产汽车取值为0,进口汽车取值为1。我们把国产汽车设置为控制组group = 0,把进口汽车设置为实验组group = 1。程序如下:
clear all 
sysuse auto,clear

gen group = 0
replace group = 1 if foreign == 1

描述性统计表

Stata中有很多整理数据的工具,我们现在要使用的是tabstat命令,tabstat命令可以在一个表中显示一系列数字变量的汇总统计信息,而且在显示统计数据和格式方面具有很大的灵活性。我们来看一下这个命令的神奇作用吧!
想要了解tabstat命令,我们可以通过help tabstat来实现,它的完整语法如下:
tabstat varlist [if] [in] [weight] [, options]
[, options]有如下的常用选项:
  1. By (varname)指定对每个唯一的varname值分别显示统计信息;Varname可以是数字或字符串。例如tabstat  by(group)表示group == 0的平均值,group == 1的平均值,总的平均值。
  2. Format和Format (%fmt)指定如何格式化统计数据。默认是使用%9.0g格式。如%9.2g表示固定列宽为9,小数点后保留两位。
  3. Save指定在r()中返回汇总统计信息。全样本统计信息以矩阵r(StatTotal)的形式返回。分类的统计信息以矩阵r(Stat1),r(Stat2),...的形式返回。
  4. Statistics (statname[…])指定要显示的统计信息;默认是平均值,括号中可以指定的数据统计如下:
选项名说明
sd标准差
mean平均值
semean标准误差平均值
median中位数
count /n非缺失的观测值个数
sum求和
range极差(范围误差、全距)
min最小值
max最大值
cv变异系数
skewness偏度
kurtosis峰度
iqr四分位距(四分差)
p1第1百分位数
p5第5百分位数
p10第10百分位数
p25第25百分位数
p50第50百分位
p75第75百分位数
p99第99百分位数
variance方差
学会了tabstat的基本用法,我们就可以用输出控制组,实验组,全样本组的某些变量的统计信息。如果想要展示三个组中price、 wei、 len、 mpg、 rep78这些变量的样本量,平均值,标准差,中位数,就需要执行如下程序:
tabstat price wei len mpg rep78,by(group) ///
stats(n mean sd p50) c(s) f(%6.2f) save

return list
执行以上程序之后,通过return list命令,我们可以看到内存中的三个矩阵,分别叫做r(Stat1),r(Stat2),r(StatTotal),分别代表控制组,实验组和全样本组的统计数据。如图所示:

矩阵合并

看起来,我们已经成功了一半啦!是不是直接用matrix命令合并矩阵就可以啦?但是,一般情况下,描述性统计表格中的列标签是变量名称,标签是统计量,因此,我们想要把这些矩阵先进行转置再合并。所以我们应该用矩阵matrix命令,把r(Stat1),r(Stat2),r(StatTotal)代表的控制组、实验组和全样本组,输出为矩阵A,B,C,之后进行转置和合并。命令如下:
matrix A = r(Stat1)
matrix B = r(Stat2)
matrix C = r(StatTotal)
matlist A 
matlist B
matlist C

mat A = A'
mat B = B'

mat C = C'
matlist A 

mat ALL =[C,A,B]
matlist ALL

用putdocx输出矩阵

我们接下来要做的,自然就是把矩阵输出到word文档中,再合并单元格,调整格式啦。putdocx table命令深受广大用户的喜爱,该命令解决了以往输出表格至docx文件操作繁琐的问题,能够直接将内存中的数据、描述性统计量或回归预测结果以表格的形式输出到docx文件中,优化了用户体验。其中,putdocx table命令引入了一个函数——matrix(),可以把矩阵输出到word文档中。其基本用法如下:
putdocx table tablename = matrix(matname) [, nformat(%fmt) rownames colnames table_options]
table options有几个常用的选择:
  • 选项width()用于指定表格宽度;

  • 选项layout()用来调整表格的列宽,包括fixed、autofitwindow、autofitcontents三种样式,fixed表示所有列宽相同,autofitwindow表示根据窗口大小自动调整列宽,autofitcontents表示根据表格内容自动调整列宽,默认根据窗口大小自动调整列宽(即autofitwindow);

  • 选项halign()用来设置表格的水平对齐方式,可以选择left(左对齐)、right(右对齐)或center(居中对齐),默认为左对齐(即left)。
(1)首先,我们生成一个横向的A4纸版式的word文档,用matrix函数,把矩阵输出到word中,本例中的程序如下:

putdocx clear
putdocx begin, pagesize(A4) landscape
putdocx table t1 = matrix(ALL), nformat(%8.2f) rownames colnames halign(center) layout(autofitcontents)
生成的word 的表格的图片如图所示:
(2)调整表格的具体内容
调整表格的具体内容用到的是如下选项:
  • tablename(i, j)表示表格的第i行,第j列,例如tablename(1, .)表示第一行,tablename(1, 1)表示第一行第一列,tablename(., .)表示全部表格。
  • rowspan()表示垂直合并单元格;
  • colsapan()表示横向合并单元格;
  • addrows(# [, before|after])在指定位置前或者后添加#行;
  • addcols(# [, before|after])在指定位置前或者后添加#列;
  • drop表示删除指定的行或列;
  • halign()设置水平对齐方式;
  • valign()设置垂直对齐方式;
  • font()设置字体字号和颜色。
对于本例,首先用addrows()选项,在第一行前添加两行。
然后,把第一行的全部13列合并,并命名为“描述性统计”。
接着,把第二行的第二列到第五列合并,命名为“全样本”;把原来的第六列到第九列合并,命名为“控制组”;把原来的第十列到第十三列合并,命名为“实验组”。值得注意的是,由于程序是一步一步运行的,所以原来的第二行第六列在上一步程序运行过后,变成了第二行第二列t1(2,3),原来的第二行第十列变成了第二行第四列t1(2,4)。
最后,把第三行第一列命名为“变量名称”;把表格样式调为水平居中对齐,宋体;保存为table.docx文件。
具体的程序如下:
putdocx table t1(1, .),addrows(2,before)
putdocx table t1(1, 1) = ("描述性统计"),colspan(13) 
putdocx table t1(2, 2) = ("全样本"),colspan(4)
putdocx table t1(2, 3) = ("控制组"),colspan(4) 
putdocx table t1(2, 4) = ("实验组"),colspan(4) 
putdocx table t1(3, 1) = ("变量名称")
putdocx table t1(., .),halign(center) font("宋体"
putdocx save table.docx,replace
shellout table.docx
此时,描述性统计表就得到啦,是不是很简单呢,大家现在也动手练习一下吧~
全部的程序如下图所示:
clear all 
sysuse auto,clear
gen group = 0
replace group = 1 if foreign == 1

tabstat price wei len mpg rep78,by(group) ///
stats(n mean sd p50) c(s) f(%6.2f) save
return list

matrix A = r(Stat1)
matrix B = r(Stat2)
matrix C = r(StatTotal)
matlist A 
matlist B
matlist C

mat A = A'
mat B = B'

mat C = C'
matlist A

mat ALL =[C,A,B]
matlist ALL

putdocx clear
putdocx begin, pagesize(A4) landscape
putdocx table t1 = matrix(ALL), nformat(%8.2f) rownames colnames halign(center) layout(autofitcontents) 

putdocx table t1(1,.),addrows(2,before)
putdocx table t1(1,1) = ("描述性统计"),colspan(13) 
putdocx table t1(2,2) = ("全样本"),colspan(4)
putdocx table t1(2,3) = ("控制组"),colspan(4) 
putdocx table t1(2,4) = ("实验组"),colspan(4) 
putdocx table t1(3,1) = ("变量名称")
putdocx table t1(., .),halign(center) font("宋体") 
putdocx save table.docx,replace






星标⭐我们不迷路!想要文章及时到,文末“在看”少不了!

点击搜索你感兴趣的内容吧


往期推荐


数据可视化 | 数据可视化实用干货分享

数据应用 | 如何用中国全量企业注册信息数据观察中央环保督察与产业结构调整

付定享优惠 转发得数据

Stata绘图:回归系数可视化-论文更出彩

数据应用|《管理世界》!多源数据融合应用是王道

付定享优惠 转发得数据

数据资源 | 国外调查记者常用的16个数据网站





数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


推荐 | 青酱


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存